package com.rf.richfitwheel.admin.iam.controller;

import com.rf.richfitwheel.admin.iam.service.PortalOrgService;
import com.rf.richfitwheel.admin.iam.service.PortalRoleMemberService;
import com.rf.richfitwheel.admin.iam.service.PortalUsbKeyService;
import com.rf.richfitwheel.admin.iam.service.PortalUserService;
import com.rf.richfitwheel.admin.sys.model.Config;
import com.rf.richfitwheel.admin.sys.service.ConfigService;
import com.rf.richfitwheel.admin.sys.vo.UserVO;
import com.rf.richfitwheel.common.utils.R;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

/**
 * @author hushouquan
 */
@RestController
@RequestMapping("/iam/portalSyn")
public class PortalSynController{
    
    private final Logger log = LoggerFactory.getLogger(PortalSynController.class);
    
    @Autowired
    private PortalOrgService portalOrgService;
    @Autowired
    private PortalUserService portalUserService;
    @Autowired
    private PortalRoleMemberService portalRoleMemberService;
    @Autowired
    private ConfigService configService;
    @Autowired
    private PortalUsbKeyService portalUsbKeyService;
    
    /**
     * 组织机构同步任务，同步入库+处理
     * @param appId 门户给咱的集成唯一编号
     * @return 处理结果
     */
    @GetMapping("/orgSyn/{appId}")
    public R orgSyn(@PathVariable("appId") String appId) {
        //数据同步的游标,初始游标，在同步入库中不再进行游标存取，减少数据查询
        Config config = configService.getParamVlueByKey("IAM_ORGS_SYNC_CURSOR");
        try{
            //入库时间
            long myDate = new Date().getTime();
            log.info("开始执行组织机构数据同步................");
            long start = System.currentTimeMillis();
            //同步数据总条数
            Integer countSyn = 0;
            //调用接口同步数据并入库
            countSyn = portalOrgService.orgSynDo(appId, myDate, config, countSyn);
            long end = System.currentTimeMillis();
            log.info("执行组织机构数据同步完成，共同步{}条数据，用时{}秒................", countSyn, (end-start)/1000);
            //处理入库后的数据
            log.info("开始执行组织机构数据更新................");
            long start1 = System.currentTimeMillis();
            portalOrgService.orgDeal(myDate);
            long end1 = System.currentTimeMillis();
            log.info("执行组织机构数据更新完成，共用时{}秒................", (end1-start1)/1000);
            return R.ok("执行成功");
        }catch(Exception e){
            log.error("执行失败", e);
            return R.error("执行失败" + e.getMessage());
        }finally{
            UserVO user = new UserVO();
            user.setId("1");
            configService.update(config, user);
        }
    }
    
    /**
     * 组织机构同步任务，已入库的情况下进行处理
     * @param myDate 时间戳毫秒值，同步的时间
     * @return 处理结果
     */
    @GetMapping("/orgDeal/{myDate}")
    public R orgDeal(@PathVariable("myDate") Long myDate){
        try{
            //处理入库后的数据
            log.info("开始执行组织机构数据更新................");
            long start1 = System.currentTimeMillis();
            portalOrgService.orgDeal(myDate);
            long end1 = System.currentTimeMillis();
            log.info("执行组织机构数据更新完成，共用时{}秒................", (end1-start1)/1000);
            return R.ok("执行成功");
        }catch(Exception e){
            log.error("执行失败", e);
            return R.error("执行失败" + e.getMessage());
        }
    }
    
    /**
     * 用户同步任务，同步入库+处理
     * @param appId 门户给咱的集成唯一编号
     * @return 处理结果
     */
    @GetMapping("/userSyn/{appId}/{cursorKey}")
    public R userSyn(@PathVariable("appId") String appId, @PathVariable("cursorKey") String cursorKey) {
        //数据同步的游标,初始游标，在同步入库中不再进行游标存取，减少数据查询
        Config config = null;
        try{
            config = configService.getParamVlueByKey(cursorKey);
            //入库时间
            long myDate = new Date().getTime();
            log.info("开始执行用户数据同步................");
            long start = System.currentTimeMillis();
            //同步数据总条数
            Integer countSyn = 0;
            //调用接口同步数据并入库
            countSyn = portalUserService.userSynDo(appId, myDate, config, countSyn);
            long end = System.currentTimeMillis();
            log.info("执行用户数据同步完成，共同步{}条数据，用时{}秒................", countSyn, (end-start)/1000);
            //处理入库后的数据
            log.info("开始执行用户数据更新................");
            long start1 = System.currentTimeMillis();
            portalUserService.userDeal(myDate);
            long end1 = System.currentTimeMillis();
            log.info("执行用户数据更新完成，共用时{}秒................", (end1-start1)/1000);
            return R.ok("执行成功");
        }catch(Exception e){
            log.error("执行失败", e);
            return R.error("执行失败" + e.getMessage());
        }finally{
            UserVO user = new UserVO();
            user.setId("1");
            if(config != null){
                configService.update(config, user);
            }
        }
    }
    
    /**
     * 当同步成功入库后续处理失败时单独处理用户
     * @param myDate 时间戳毫秒值，同步的时间
     * @return 处理结果
     */
    @GetMapping("/userDeal/{myDate}")
    public R userDeal(@PathVariable("myDate") Long myDate){
        try{
            //处理入库后的数据
            log.info("开始执行用户数据更新................");
            //入库时间
            long start1 = System.currentTimeMillis();
            portalUserService.userDeal(myDate);
            long end1 = System.currentTimeMillis();
            log.info("执行用户数据更新完成，共用时{}秒................", (end1-start1)/1000);
            return R.ok("执行成功");
        }catch(Exception e){
            log.error("执行失败", e);
            return R.error("执行失败" + e.getMessage());
        }
    }
    
    /**
     * usbKey同步任务，同步入库+处理
     * @param appId 门户给咱的集成唯一编号
     * @return 处理结果
     */
    @GetMapping("/usbKeySyn/{appId}/{cursorKey}")
    public R usbKeySyn(@PathVariable("appId") String appId, @PathVariable("cursorKey") String cursorKey) {
        //数据同步的游标,初始游标，在同步入库中不再进行游标存取，减少数据查询
        Config config = null;
        try{
            config = configService.getParamVlueByKey(cursorKey);
            //入库时间
            long myDate = new Date().getTime();
            log.info("开始执行usbKey数据同步................");
            long start = System.currentTimeMillis();
            //同步数据总条数
            Integer countSyn = 0;
            //调用接口同步数据并入库
            countSyn = portalUsbKeyService.usbKeySynDo(appId, myDate, config, countSyn);
            long end = System.currentTimeMillis();
            log.info("执行usbKey数据同步完成，共同步{}条数据，用时{}秒................", countSyn, (end-start)/1000);
            //处理入库后的数据
            log.info("开始执行usbKey数据更新................");
            long start1 = System.currentTimeMillis();
            portalUsbKeyService.usbKeyDeal(myDate);
            long end1 = System.currentTimeMillis();
            log.info("执行usbKey数据更新完成，共用时{}秒................", (end1-start1)/1000);
            return R.ok("执行成功");
        }catch(Exception e){
            log.error("执行失败", e);
            return R.error("执行失败" + e.getMessage());
        }finally{
            UserVO user = new UserVO();
            user.setId("1");
            if(config != null){
                configService.update(config, user);
            }
        }
    }
    
    /**
     * 当同步成功入库后续处理失败时单独处理usbKey
     * @param myDate 时间戳毫秒值，同步的时间
     * @return 处理结果
     */
    @GetMapping("/usbKeyDeal/{myDate}")
    public R usbKeyDeal(@PathVariable("myDate") Long myDate){
        try{
            //处理入库后的数据
            log.info("开始执行usbKey数据更新................");
            //入库时间
            long start1 = System.currentTimeMillis();
            portalUsbKeyService.usbKeyDeal(myDate);
            long end1 = System.currentTimeMillis();
            log.info("执行usbKey数据更新完成，共用时{}秒................", (end1-start1)/1000);
            return R.ok("执行成功");
        }catch(Exception e){
            log.error("执行失败", e);
            return R.error("执行失败" + e.getMessage());
        }
    }
}
